home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 39 / Amiga Format CD39 (1999-04-13)(Future Publishing)(GB)[!][issue 1999-05].iso / -websites- / ppcrulez / files / ramlibpatch.lha / RamLibPatch / RamLibPatch.c < prev    next >
C/C++ Source or Header  |  1998-07-15  |  2KB  |  92 lines

  1. /*
  2. **      $VER: RamLibPatch 1.1 (15.7.97)
  3. **
  4. **      Patches the "ramlib" process to use a bigger stack
  5. **
  6. **      (C) Copyright 1998 Andreas R. Kleinert
  7. **      All Rights Reserved.
  8. */
  9.  
  10. #define __USE_SYSBASE
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/tasks.h>
  15.  
  16. #include <proto/exec.h>
  17. #include <proto/dos.h>
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22.  
  23. char ver_text [] = "\0$VER: RamLibPatch 1.1 (15.7.98)";
  24.  
  25. #ifdef __SASC
  26.  
  27. extern BPTR _Backstdout;
  28. extern struct WBStartup *WBenchMsg;
  29.  
  30. long  __stack        = 4096;
  31. char *__procname     = "RamLibPatch";
  32. long  __priority     = 1;
  33. long  __BackGroundIO = 1;
  34.  
  35. void __regargs __chkabort(void) { }
  36. void __regargs _CXBRK(void)     { }
  37.  
  38. #endif /* __SASC */
  39.  
  40.  
  41. #define STACKSIZE 16384
  42.  
  43.  
  44.  /* NOTE: This is NOT a good example for stack swapping,
  45.           since the OLD stack's buffer _NEVER_ will
  46.           be delocated. However, there is not other
  47.           way to achieve a larger stack for RamLib,
  48.           and since RamLib never will end, this perhaps
  49.           isn't a problem...
  50.  */
  51.  
  52. void main(long argc, char **argv)
  53. {
  54.  struct Task *we;
  55.  UBYTE *msg;
  56.  
  57.  we = FindTask("ramlib");
  58.  if(we)
  59.   {
  60.    Forbid();
  61.  
  62.    if( (ULONG) we->tc_SPUpper - (ULONG) we->tc_SPLower < STACKSIZE)
  63.     {
  64.      UBYTE *lower, *upper, *pointer;
  65.      ULONG inuse;
  66.  
  67.      lower   = (UBYTE *) AllocVec(16384, MEMF_PUBLIC);
  68.      upper   = (UBYTE *) (STACKSIZE + (UBYTE *) lower);
  69.  
  70.      inuse = (ULONG) we->tc_SPUpper - (ULONG) we->tc_SPReg;
  71.  
  72.      pointer = ((UBYTE *) upper) - inuse;
  73.  
  74.      CopyMem(we->tc_SPReg, pointer, inuse);
  75.  
  76.      we->tc_SPReg   = (APTR) pointer;
  77.      we->tc_SPLower = (APTR) lower;;
  78.      we->tc_SPUpper = (APTR) upper;
  79.  
  80.      msg = "Patch done!\n";
  81.  
  82.    }else msg = "Already patched.\n";
  83.  
  84.    Permit();
  85.  
  86.   }else  msg = "Wrong AmigaOS version.\n";
  87.  
  88.  if(_Backstdout) Write(_Backstdout, msg, strlen(msg));
  89.  
  90.  exit(0);
  91. }
  92.